'''
::
    
    ################### SPI 传输类型 ###################
    
    SPI_WR    = 0x0000      #双向传输
    SPI_OnlyW = 0x0001      #只发送
    SPI_OnlyR = 0x0002      #只接收
    
    
    ################### IIC 传输类型 ###################
    I2C_START_W    = 0x0000      #Start+WAddr+WDat
    I2C_W          = 0x0001      #WDat
    I2C_START_R    = 0x0100      #Start+RAddr+RDat
    I2C_R          = 0x0200      #RDat
    I2C_P           =0x8000      #Stop 中途需要发送停止位
    
    
    ###################SPI模式##############################
    User_SPI_4Wire = 0x00 
    User_SPI_3Wire = 0x10 
    User_SPI_DSPI  = 0x20 
    User_SPI_QSPI  = 0x30 
    
'''

class spi_message(object):
    '''    
        SPI 发送接收消息对象
    '''

    def spi_type(self):
        '''    
        SPI 传输类型
        '''

    def spi_len(self):
        '''    
        SPI 传输的长度
        '''

    def spi_dc(self):
        '''    
        SPI DC使能位
        '''

    def RX_Buffer(self):
        '''    
        SPI 接收缓冲区
        '''

    def TX_Buffer(self):
        '''    
        SPI 发送缓冲区
        '''

class iic_message(object):
    '''    
        IIC 发送接收消息对象
    '''

    def iic_type(self):
        '''    
        IIC 传输类型
        '''

    def iic_addr(self):
        '''    
        IIC 器件地址
        '''

    def iic_len(self):
        '''    
        IIC 消息长度
        '''

    def IIC_Buffer(self):
        '''    
        IIC 接收发送缓冲区
        '''

def SHARP_SPI_WireMode(mode):
    '''
    SPI模式修改 可供选择的模式有 三线spi,四线SPI,DSPI,QSPI
    * 参数  
        * fmode :模式
    * 返回   : 无
    '''

def SHARP_SPI_CS_LevelSet(Level):
    '''
    软件控制复用后的片选

    * 参数  
        * Level : 1--高电平 0--低电平  其他--无效
    * 返回   : 无

    '''

def SHARP_SPI_DataIo_ModeSet(mode):
    '''
    控制数据引脚输入输出切换

    * 参数   
        * mode : 模式  1--输出  0--输入 其他--无效

    * 返回   : 无
    '''

def SHARP_SPI_DataBit_Mode(databit):
    '''
    控制数据位切换。

    * 参数   
        * databit : 数据位  8--8bit  9--9bit 其他--无效

    * 返回   : 无

    '''

def SHARP_spi_init(**kwargs):
    '''         
    spi初始化

    * 参数  
        * kwargs 可变参数

    * 返回  
        * adapter 设备类

    * 说  明 ：id(id号 必须要传  硬件spi--1,软件spi--0,1.配置硬件SPI时,模式配置完之后还需要把引脚配成复用。2.软件SPI只实现了4线模式)
            mode(SPI模式 3--三线SPI 4--四线SPI 5--DSPI 6--QSPI 默认说4线SPI 必须要传) 
            baudrate(分频值 主频是50M分频  默认10--5M 必须要传) 
            polarity(极性可以是 0 或 1，是时钟空闲时所处的电平。默认0 必须要传)
            phase (相位可以是 0 或 1，分别在第一个或者第二个时钟边缘采集数据。默认0  必须要传)
            bits (每次传输的数据长度，默认是 8 位。  可以不传)
            firstbit (传输数据从高位开始还是从低位开始 默认MSB  可以不传)
            sck (sck对象 对应IO口宏)    id 置为1后 此值无效
            mosi (mosi对象 对应IO口宏)   id 置为1后 此值无效
            miso (miso对象 对应IO口宏)   id 置为1后 此值无效
            number(当前初始化spi的序列号) 默认为0 当需要初始化多组spi的时候需要赋值 
            
    * 示例： 软件spi adapter = spi_init(id = 0,mode = 4,baudrate = 10,polarity = 1,phase = 1,sck = LCD_TP_SCK,mosi = LCD_TP_MOSI,miso = LCD_TP_MISO)
        硬件spi adapter = spi_init(id = 1,mode = 4,baudrate = 10,polarity = 1,phase = 1,sck = LCD_TP_SCK,mosi = LCD_TP_MOSI,miso = LCD_TP_MISO)      #配置硬件SPI时,模式配置完之后还需要把引脚配成复用。
                UserIO_AF_Set(USER_TP_MISO_AF,USER_IO_AF)
                UserIO_AF_Set(USER_TP_MOSI_AF,USER_IO_AF)
                UserIO_AF_Set(USER_TP_SCK_AF,USER_IO_AF)

    '''

def SHARP_SPI_transfer(adap,message,msgs_num):
    '''         
    spi发送接收方法

    * 参数  
        * adap ：设备类 
        * message ：消息类
        * msgs_num ：连续处理包个数

    * 返回 : 无 

    * 示例 :        byte_buf = bytearray(5)
                    message = spi_message()
                    message.spi_type = SPI_OnlyW      类型 见第14行          
                    message.spi_len = 5
                    message.RX_Buffer = byte_buf     有接收时候在传 byte类型数据
                    message.TX_Buffer = byte_buf      有发送的时候在传
                    SPI_transfer(adapter,message)
        
    '''

def SHARP_IIC_init(**kwargs):
    '''         
    IIC初始化

    * 参数  
        * kwargs 可变参数

    * 返回 
        * adapter 设备类

    * 说  明 ：id(id号 必须要传  硬件IIC--1,软件IIC--0   当前只实现软件IIC)
            scl(scl对象 对应IO口宏  硬件IIC可以不传)    id置为1后 此值无效
            sda(sda对象 对应IO口宏  硬件IIC可以不传)    id置为1后 此值无效
            freq (scl 的最大频率)
            timeout (等待ack超时时间)
            iic_delay(IIC时钟和数据脚的间隔时间 可以通过此去控制IIC速率默认为1,对应时钟速率90K)
            number(当前初始化IIC的序列号) 默认为0 当需要初始化多组IIC的时候需要赋值 

    * 示例： 软件IIC  IIC_init(id = 0,scl = LCD_TP_SCL,sda = LCD_TP_SDA,freq=10000,iic_delay = 1) 
        
    '''

def SHARP_IIC_transfer(adap,message,msgs_num):
    '''         
    iic发送接收方法

    * 参数 
        * adap 设备类  
        * message 消息类
        * msgs_num ：连续处理包个数

    * 返回 : 无

    * 示例 :       byte_buf = bytearray(5)
                    message = iic_message()
                    message.iic_type = I2C_START_R      类型 见第14行          
                    message.iic_len = 5
                    message.IIC_Buffer = byte_buf       此处传的是发送的byte,如果有接收可在IIC_transfer后面在回读一下IIC_Buffer
                    IIC_transfer(adapter,message)

    '''

def SHARP_IIC_DevExist(adap,addr):
    '''
    判断器件是否存在

    * 参数  
        * adap:  设备类   
        * addr:   地址
    
    * 返回  
        * 0地址存在  
        * -1地址不存在

    '''

class SPI(object):
    '''         
    spi类

    * 参数  
        * kwargs 可变参数

    * 返回  
        * adapter 设备类

    * 说  明 ：id(id号 必须要传  硬件spi--1,软件spi--0,1.配置硬件SPI时,模式配置完之后还需要把引脚配成复用。2.软件SPI只实现了4线模式)
            mode(SPI模式 3--三线SPI 4--四线SPI 5--DSPI 6--QSPI 默认说4线SPI 必须要传) 
            baudrate(分频值 主频是50M分频  默认10--5M 必须要传) 
            polarity(极性可以是 0 或 1，是时钟空闲时所处的电平。默认0 必须要传)
            phase (相位可以是 0 或 1，分别在第一个或者第二个时钟边缘采集数据。默认0  必须要传)
            bits (每次传输的数据长度，默认是 8 位。  可以不传)
            firstbit (传输数据从高位开始还是从低位开始 默认MSB  可以不传)
            sck (sck对象 对应IO口宏)    无论硬件还是软件 传了指定对象后,底层会自动初始化IO
            mosi (mosi对象 对应IO口宏)   无论硬件还是软件 传了指定对象后,底层会自动初始化IO
            miso (miso对象 对应IO口宏)   无论硬件还是软件 传了指定对象后,底层会自动初始化IO
            number(当前初始化spi的序列号) 默认为0 当需要初始化多组spi的时候需要赋值 
            
    * 示例： 软件spi adapter = spi_init(id = 0,mode = 4,baudrate = 10,polarity = 1,phase = 1,sck = LCD_TP_SCK,mosi = LCD_TP_MOSI,miso = LCD_TP_MISO)
            硬件spi adapter = spi_init(id = 1,mode = 4,baudrate = 10,polarity = 1,phase = 1,sck = LCD_TP_SCK,mosi = LCD_TP_MOSI,miso = LCD_TP_MISO)      


    '''

   #'''
   #::
    
    SPI_WR    = 0x0000      #双向传输
    SPI_OnlyW = 0x0001      #只发送
    SPI_OnlyR = 0x0002      #只接收
    
   #'''

    def send(self,send_buf:bytearray,send_length:int,dc=None):
        '''         
        发送一次数据

        * 参数  
            * send_buf ：发送数据缓冲区(传得必须为字节对象)
            * send_length ：发送数据字节数
            * dc ：dc位(9位的时候使用,8位可不传)
        * 返回 : 无 

        * 示例 :        Send_buf = bytearray(5)
                        Send_buf[0] = 0xFF
                        Send_buf[1] = ((addr<<1) & 0xFF0000)>>16
                        Send_buf[2] = ((addr<<1) & 0x00FF00)>>8
                        send(Send_buf,3)
            
        '''

    def Read(self,length:int,dc=None):
        '''         
        接收一次数据

        * 参数  
            * length ：接收数据字节数
            * dc ：dc位(9位的时候使用,8位可不传)

        * 返回 : 接收数据缓冲区

        * 示例 :    Send_buf[0] = (addr & 0x00007F)
                    Send_buf[1] = 0x00
                    send(Send_buf,2)
                    pbuf = Read(length)   
            
        '''

    def send_then_send(self,send_buf1:bytearray,send_length1:int,send_buf2:bytearray,send_length2:int,dc=None):
        '''         
        连续发送两次数据(中间片选不释放)

        * 参数  
            * send_buf1 发送数据缓冲区 1 
            * send_buf2 发送数据缓冲区 2
            * send_length1 发送数据缓冲区 1 数据字节数
            * send_length2 发送数据缓冲区 1 数据字节数
            * dc ：dc位(9位的时候使用,8位可不传)

        * 返回 : 无 

        * 示例 : Send_buf = bytearray(5)
                Send_buf[0] = 0xFF
                Send_buf[1] = ((addr<<1) & 0xFF0000)>>16
                Send_buf[2] = ((addr<<1) & 0x00FF00)>>8
                send_then_send(Send_buf,3,Send_buf,3)
                        
            
        '''

    def send_then_recv(self,send_buf:bytearray,send_length:int,recv_length:int,send_dc=None,recv_dc=None):
        '''         
        先发送后接收数据(中间片选不释放)

        * 参数  
            * send_buf1 发送数据缓冲区 1 
            * recv_length 接收数据缓冲区指针
            * send_length 发送数据缓冲区 数据字节数
            * send_dc ：发送dc位(9位的时候使用,8位可不传)
            * recv_dc 接收dc位(9位的时候使用,8位可不传)

        * 返回 : 接收数据缓冲区

        * 示例 :    Send_buf[0] = (addr & 0x00007F)
                    Send_buf[1] = 0x00
                    pbuf = my_spi.send_then_recv(Send_buf,2,length)
                    return pbuf
            
        '''

    def SPI_transfer(self,message,msgs_num):
        '''         
        自定义传输数据

        * 参数  
            * message ：消息类
            * msgs_num ：连续处理包个数

        * 返回 : 无 

        * 示例 :        byte_buf = bytearray(5)
                        message = spi_message()
                        message.spi_type = SPI_OnlyW      类型 见第14行          
                        message.spi_len = 5
                        message.RX_Buffer = byte_buf     有接收时候在传 byte类型数据
                        message.TX_Buffer = byte_buf      有发送的时候在传
                        SPI_transfer(adapter,message)
            
        '''

class IIC(object):
    '''         
    IIC模块类

    * 参数  
        * kwargs 可变参数

    * 返回 
        * adapter 设备类

    * 说  明 ：id(id号 必须要传  硬件IIC--1,软件IIC--0   当前只实现软件IIC)
            scl(scl对象 对应IO口宏  硬件IIC可以不传)    id置为1后 此值无效
            sda(sda对象 对应IO口宏  硬件IIC可以不传)    id置为1后 此值无效
            freq (scl 的最大频率)
            timeout (等待ack超时时间)
            iic_delay(IIC时钟和数据脚的间隔时间 可以通过此去控制IIC速率默认为1,对应时钟速率90K)
            number(当前初始化IIC的序列号) 默认为0 当需要初始化多组IIC的时候需要赋值 

    * 示例：
        
    '''

   #'''
   #::
        ################### IIC 传输类型 ###################
    I2C_START_W    = 0x0000      #Start+WAddr+WDat
    I2C_W          = 0x0001      #WDat
    I2C_START_R    = 0x0100      #Start+RAddr+RDat
    I2C_R          = 0x0200      #RDat
    I2C_P           =0x8000      #Stop 中途需要发送停止位
   #'''

    def send(self,addr,send_length,length):
        '''         
        iic发送一次数据

        * 参数 
            * addr :器件地址  
            * data ：发送数据缓冲区
            * data_len ：发送数据长度

        * 返回 : 无

        * 示例 :       

        '''

    def recv(self,addr,length):
        '''         
        iic接收一次数据

        * 参数 
            * addr :器件地址  
            * data_len ：接收数据长度

        * 返回 : 无

        * 示例 :       

        '''

    def IIC_transfer(self,message,msgs_num):
        '''         
        iic自定义发送数据

        * 参数 
            * adap 设备类  
            * message 消息类
            * msgs_num ：连续处理包个数

        * 返回 : 无

        * 示例 :       byte_buf = bytearray(5)
                        message = iic_message()
                        message.iic_type = I2C_START_R      类型 见第14行          
                        message.iic_len = 5
                        message.IIC_Buffer = byte_buf       此处传的是发送的byte,如果有接收可在IIC_transfer后面在回读一下IIC_Buffer
                        IIC_transfer(adapter,message)

        '''

